home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / cpu / pdp1 / pdp1dasm.c < prev   
C/C++ Source or Header  |  1999-09-02  |  5KB  |  288 lines

  1. #include <stdio.h>
  2. #include <strings.h>
  3. #include "cpu/pdp1/pdp1.h"
  4.  
  5. /* PDP1 registers */
  6. static int ib;
  7. static int y;
  8.  
  9. INLINE void ea (void)
  10. {
  11.     while (1)
  12.     {
  13.         if (ib == 0)
  14.             return;
  15.         ib = (READ_PDP_18BIT (y) >> 12) & 1;
  16.         y = READ_PDP_18BIT (y) & 07777;
  17.     }
  18. }
  19.  
  20. #define IN if (ib) sprintf(buffer+strlen(buffer)," i")
  21.  
  22. unsigned dasmpdp1 (char *buffer, unsigned _pc)
  23. {
  24.     int md;
  25.     int etime = 0;
  26.  
  27.     md = READ_PDP_18BIT (_pc);
  28.  
  29.     y = md & 07777;
  30.     ib = (md >> 12) & 1;               /* */
  31.     switch (md >> 13)
  32.     {
  33.     case AND:
  34.         ea ();
  35.         sprintf (buffer, "AND (0%06o)", y);
  36.         IN;
  37.         etime = 10;
  38.         break;
  39.     case IOR:
  40.         ea ();
  41.         sprintf (buffer, "IOR (0%06o)", y);
  42.         IN;
  43.         etime = 10;
  44.         break;
  45.     case XOR:
  46.         ea ();
  47.         sprintf (buffer, "XOR (0%06o)", y);
  48.         IN;
  49.         etime = 10;
  50.         break;
  51.     case XCT:
  52.         ea ();
  53.         sprintf (buffer, "XCT (0%06o)", y);
  54.         IN;
  55.         etime = 5;
  56.         break;
  57.     case CALJDA:
  58.         {
  59.             if (ib == 1)
  60.                 sprintf (buffer, "JDA 0%06o  ", y);
  61.             if (ib == 0)
  62.                 sprintf (buffer, "CAL         ");
  63.             etime = 10;
  64.             break;
  65.         }
  66.     case LAC:
  67.         ea ();
  68.         sprintf (buffer, "LAC (0%06o)", y);
  69.         IN;
  70.         etime = 10;
  71.         break;
  72.     case LIO:
  73.         ea ();
  74.         sprintf (buffer, "LIO (0%06o)", y);
  75.         IN;
  76.         etime = 10;
  77.         break;
  78.     case DAC:
  79.         ea ();
  80.         sprintf (buffer, "DAC 0%06o  ", y);
  81.         IN;
  82.         etime = 10;
  83.         break;
  84.     case DAP:
  85.         ea ();
  86.         sprintf (buffer, "DAP 0%06o  ", y);
  87.         IN;
  88.         etime = 10;
  89.         break;
  90.     case DIO:
  91.         ea ();
  92.         sprintf (buffer, "DIO 0%06o  ", y);
  93.         IN;
  94.         etime = 10;
  95.         break;
  96.     case DZM:
  97.         ea ();
  98.         sprintf (buffer, "DZM 0%06o  ", y);
  99.         IN;
  100.         etime = 10;
  101.         break;
  102.     case ADD:
  103.         ea ();
  104.         sprintf (buffer, "ADD (0%06o)", y);
  105.         IN;
  106.         etime = 10;
  107.         break;
  108.     case SUB:
  109.         ea ();
  110.         sprintf (buffer, "SUB (0%06o)", y);
  111.         IN;
  112.         etime = 10;
  113.         break;
  114.     case IDX:
  115.         ea ();
  116.         sprintf (buffer, "IDX (0%06o)", y);
  117.         IN;
  118.         etime = 10;
  119.         break;
  120.     case ISP:
  121.         ea ();
  122.         sprintf (buffer, "ISP (0%06o)", y);
  123.         IN;
  124.         etime = 10;
  125.         break;
  126.     case SAD:
  127.         ea ();
  128.         sprintf (buffer, "SAD (0%06o)", y);
  129.         IN;
  130.         etime = 10;
  131.         break;
  132.     case SAS:
  133.         ea ();
  134.         sprintf (buffer, "SAS (0%06o)", y);
  135.         IN;
  136.         etime = 10;
  137.         break;
  138.     case MUS:
  139.         ea ();
  140.         sprintf (buffer, "MUS (0%06o)", y);
  141.         IN;
  142.         etime = 10;
  143.         break;
  144.     case DIS:
  145.         ea ();
  146.         sprintf (buffer, "DIS (0%06o)", y);
  147.         IN;
  148.         etime = 10;
  149.         break;
  150.     case JMP:
  151.         ea ();
  152.         sprintf (buffer, "JMP 0%06o  ", y);
  153.         IN;
  154.         etime = 5;
  155.         break;
  156.     case JSP:
  157.         ea ();
  158.         sprintf (buffer, "JSP 0%06o  ", y);
  159.         IN;
  160.         etime = 5;
  161.         break;
  162.     case SKP:
  163.         {
  164.             buffer[0] = 0;
  165.             if ((y & 0100) == 0100)
  166.                 sprintf (buffer, "SZA ");
  167.             if ((y & 0200) == 0200)
  168.                 sprintf (buffer + strlen (buffer), "SPA ");
  169.             if ((y & 0400) == 0400)
  170.                 sprintf (buffer + strlen (buffer), "SMA ");
  171.             if ((y & 01000) == 01000)
  172.                 sprintf (buffer + strlen (buffer), "SZO ");
  173.             if ((y & 02000) == 02000)
  174.                 sprintf (buffer + strlen (buffer), "SPI ");
  175.             if (y & 070)
  176.                 sprintf (buffer + strlen (buffer), "SZS 0%01o ", (y & 070));
  177.             if (y & 7)
  178.                 sprintf (buffer + strlen (buffer), "SZF 0%01o ", (y & 7));
  179.             IN;
  180.             etime = 5;
  181.             break;
  182.         }
  183.     case SFT:
  184.         {
  185.             int nshift = 0;
  186.             int mask = md & 0777;
  187.  
  188.             while (mask != 0)
  189.             {
  190.                 nshift += mask & 1;
  191.                 mask = mask >> 1;
  192.             }
  193.             switch ((md >> 9) & 017)
  194.             {
  195.             case 1:
  196.                 sprintf (buffer, "RAL 0%02o", nshift);
  197.                 etime = 5;
  198.                 break;
  199.             case 2:
  200.                 sprintf (buffer, "RIL 0%02o", nshift);
  201.                 etime = 5;
  202.                 break;
  203.             case 3:
  204.                 sprintf (buffer, "RCL 0%02o", nshift);
  205.                 etime = 5;
  206.                 break;
  207.             case 5:
  208.                 sprintf (buffer, "SAL 0%02o", nshift);
  209.                 etime = 5;
  210.                 break;
  211.             case 6:
  212.                 sprintf (buffer, "SIL 0%02o", nshift);
  213.                 etime = 5;
  214.                 break;
  215.             case 7:
  216.                 sprintf (buffer, "SCL 0%02o", nshift);
  217.                 etime = 5;
  218.                 break;
  219.             case 9:
  220.                 sprintf (buffer, "RAR 0%02o", nshift);
  221.                 etime = 5;
  222.                 break;
  223.             case 10:
  224.                 sprintf (buffer, "RIR 0%02o", nshift);
  225.                 etime = 5;
  226.                 break;
  227.             case 11:
  228.                 sprintf (buffer, "RCR 0%02o", nshift);
  229.                 etime = 5;
  230.                 break;
  231.             case 13:
  232.                 sprintf (buffer, "SAR 0%02o", nshift);
  233.                 etime = 5;
  234.                 break;
  235.             case 14:
  236.                 sprintf (buffer, "SIR 0%02o", nshift);
  237.                 etime = 5;
  238.                 break;
  239.             case 15:
  240.                 sprintf (buffer, "SCR 0%02o", nshift);
  241.                 etime = 5;
  242.                 break;
  243.             default:
  244.                 sprintf (buffer, "SKP ???");
  245.                 etime = 5;
  246.                 break;
  247.             }
  248.             break;
  249.         }
  250.     case LAW:
  251.         sprintf (buffer, "LAW 0%06o", y);
  252.         IN;
  253.         etime = 5;
  254.         break;
  255.     case IOT:
  256.         sprintf (buffer, "IOT 0%06o", md);
  257.         etime = 10;
  258.         break;
  259.     case OPR:
  260.         {
  261.             buffer[0] = 0;
  262.             if ((y & 04000) == 04000)
  263.                 sprintf (buffer + strlen (buffer), "CLI ");
  264.             if ((y & 02000) == 02000)
  265.                 sprintf (buffer + strlen (buffer), "LAT ");
  266.             if ((y & 01000) == 01000)
  267.                 sprintf (buffer + strlen (buffer), "CMA ");
  268.             if ((y & 0400) == 0400)
  269.                 sprintf (buffer + strlen (buffer), "HLT ");
  270.             if ((y & 0100) == 0100)
  271.                 sprintf (buffer + strlen (buffer), "LAP ");
  272.             if ((y & 010) && (y & 7))
  273.                 sprintf (buffer + strlen (buffer), "STF 0%01o ", (y & 7));
  274.             if ((!(y & 010)) && (y & 7))
  275.                 sprintf (buffer + strlen (buffer), "CLF 0%01o ", (y & 7));
  276.             if (!(y))
  277.                 sprintf (buffer + strlen (buffer), "NOP ");
  278.             etime = 5;
  279.             break;
  280.         }
  281.     default:
  282.         sprintf (buffer, "ILLEGAL");
  283.         etime = 5;
  284.         break;
  285.     }
  286.     return 1;
  287. }
  288.